/*
    ts中的类型:
        number，任意数字，比如1,2,3
        string，任意字符串，比如"hello world"
        boolean，布尔值，比如true,false
        字面量，其本身，限制变量的值就是该字面量的值
        any，任意类型
        unknown，类型安全的any
        void，空值或undefined
        never，没有值，不能是任何值
        object，任意的js对象，比如{name:'hzj'};
        array，任意的js数组，比如[1,2,3]
        tuple，元素，ts新增类型，也就是固定长度的数组
        enum，枚举类型，ts新增类型，例如enum{A,B};
    除了前三种类型，后面的可能你一时无法理解，别急，听我娓娓道来
*/

// 使用字面量赋值
let a: number = 12;

// 可以使用 | 表示或的意思，可以在类型一栏以及赋值一栏使用。比如下面
let b: number | string | object = 123;//表示b可以是这三种类型的任意一种
let c: 1 | '123' | { name: '123' };//表示a只能去下面三中值，赋别的值就爆红.

// any表示任意类型, 如果你对这个变量给了any，那就相当于关闭了ts的类型检测功能，所以开发一般不用；
// 并且，如果你对一个变量不加以类型限制，那就默认设置为any了
let d: any;
let e;//不指定类型则默认为any
d = 1;
d = '123';//你赋值成啥都行 

// unknown表示未知类型,unknow类型的数据同样可以赋任意类型的值。你是不是觉着和any没啥区别啊？别急下面告诉你区别在哪
let f: unknown;
f = 123;
f = true;

// 我们来看下any和unknow的区别，简单来说: any会霍霍别人，unknown不会
let g1: any;
let g2: string;
g1 = 123;
g2 = g1;//你会发现代码编辑器竟然没有爆红，这是因为检测机制是根据变量的类型来的，即使g1是个数值，但是他的类型是any，所以检测机制依然觉着没毛病，所以这就是any比较bug的地方，所以不建议使用

let g3: unknown;
let g4: string;
g3 = 123;
// g4 = g3;//你会发现这样就爆红了，因为unknow会被检测机制检测，认为这并不符合g4的string类型要求，所以这就是unknow和any最大的区别。

// 所以unknown实际上就是一个类型安全的any
// unknown类型的变量，不能直接赋值給其他变量
// 问题来了，以后我们的unknown类型数据如果已经成了正确类型的数据了，总不能就让他一直爆红下去吧
let h1:unknown;
let h2:string;
h1 = '111';

// 两个解决方法
// 1. typeof
if(typeof h1 == 'string'){
    h2 = h1;
}

// 2. 使用as关键字进行类型断言, 这样就是告诉编辑器h1的实际类型。
h2 = h1 as string;
h2 = <string>h1;//另一种写法，有强制转换的那味儿了吧


// void一般用于限制函数的返回值类型, 因为我们的函数很多时候是不需要有返回值的
function fun1():void{
    return undefined;//return; 或者 return undefined;或者说不return，三种方式都不会爆红，你return其他的就要爆红了
}

// never也是一般用于函数，一般来说这个代表这个函数一定报错，一定执行不完。像下面这样
function fun2():never{
    throw new Error('报错啦');
}




